﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OBL1_DiseñoDeAplicaciones.ObjetosDeNegocio;
using OBL1_DiseñoDeAplicaciones.Utilidades;

namespace OBL1_DiseñoDeAplicaciones.Interfaz
{
    public partial class Subdivision_Editar : Form,IObservado
    {
        private Subdivision _subdivision;
        private const string _Tarea = "TAREA";
        private const string _Subproyecto = "SUBPROYECTO";
        private string __subdivision="";
        private List<IObservador> observadores = new List<IObservador>();

        public Subdivision_Editar(bool esTarea,Subdivision s,IObservador i,int iva)
        {
            InitializeComponent();
            _subdivision = s;
            this.agregarObservador(i);
            txtDescripcion.Text = _subdivision.Descripcion;
            if (esTarea)
            {
                txtCosto.Text = ((Tarea)_subdivision).Costo.ToString();
                dtpFechaInicio.Value = ((Tarea)_subdivision).ObtenerFechaInicio();
                __subdivision = _Tarea;
            }
            else {
                pnlTarea.Visible = false;
                __subdivision = _Subproyecto;
            }
        }

        #region OBSERVADO
        public void agregarObservador(IObservador obs)
        {
            // Agrega un objeto Observador a la colección
            observadores.Add(obs);
        }
        public void removerObservador(IObservador obs)
        {
            observadores.Remove(obs);

        }

        public void notificarTodos()
        {
            foreach (IObservador i in observadores)
            {
                i.actualizar();

            }

        }
        #endregion 

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            bool continuar = true;
            lblDescRequerida.Visible = false;
            lblCostoRequerido.Visible = false;
            lblErrores.Text = string.Empty;

            string descripcionTemp = string.Empty;
            double costoTemp = 0;
            DateTime fechaInicioTemp = DateTime.MaxValue;

            if (!txtDescripcion.Text.Equals(string.Empty))
            {
                descripcionTemp = txtDescripcion.Text;
            }
            else
            {
                lblErrores.Text = "Debe agregar una descripción " + (__subdivision.Equals(_Tarea) ? "a la tarea." : "al subproyecto.");
                lblDescRequerida.Visible = true;
                continuar = false;
            }
            if (continuar && __subdivision.Equals(_Tarea))
            {
                if (!txtCosto.Text.Equals(string.Empty))
                {
                    try
                    {
                        costoTemp = double.Parse(txtCosto.Text.Trim());
                        fechaInicioTemp = dtpFechaInicio.Value;
                        
                    }
                    catch (FormatException)
                    {
                        lblErrores.Text = "El costo de la tarea debe ser numérico.";
                        lblCostoRequerido.Visible = true;
                        continuar = false;
                    }
                }
                else
                {
                    lblErrores.Text = "Debe agregar un costo a la tarea.";
                    lblCostoRequerido.Visible = true;
                    continuar = false;
                }
            }
            if (continuar)
            {

                _subdivision.Modificarme(descripcionTemp, costoTemp, fechaInicioTemp);
                DialogResult = DialogResult.OK;
                this.notificarTodos();
                this.Dispose();
            }
            else
            {
                lblErrores.Left = (this.Width - lblErrores.Width) / 2;
            }
        }

        private void BtnCancelar_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
            this.Dispose();
        }
    }
}
